#ifndef __INT_LCD_H__
#define __INT_LCD_H__

#include "fsmc.h"
#include "usart.h"
#include <math.h>

#define PI 3.1415926

#define SRAM_BANK4 0x6C000000
#define LCD_ADDR_CMD (uint16_t *)SRAM_BANK4
#define LCD_ADDR_DATA (uint16_t *)(SRAM_BANK4 + (1 << 11))

// ��Ļ����
#define DISPLAY_W 320
#define DISPLAY_H 480

// ������ɫ
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40  // ��ɫ
#define BRRED 0XFC07  // �غ�??
#define GRAY 0X8430 ? // ��ɫ

/**
 * @brief Lcd��ʼ??
 *
 */
void Int_LCD_Init(void);

/**
 * @brief ��λ
 *
 */
void Int_LCD_Rest(void);

/**
 * @brief ������??
 *
 */
void Int_LCD_BGOn(void);

/**
 * @brief �رձ���
 *
 */
void Int_LCD_BGOff(void);

/**
 * @brief ������??(д��??)
 *
 */
void Int_LCD_WriteCmd(uint16_t cmd);

/**
 * @brief ������??(д��??)
 *
 */
void Int_LCD_WriteData(uint16_t data);

/**
 * @brief ��ȡ����
 *
 * @return uint16_t ��������??
 */
uint16_t Int_LCD_ReadData(void);

/**
 * @brief ����LCD���ƼĴ�??
 *
 */
void Int_RegCconfig(void);

// 2.��װӦ�ýӿ�
/**
 * @brief ����ID��Ϣ
 *
 * @return uint32_t ID��Ϣ
 */
uint32_t Int_LCD_ReadID(void);

/**
 * @brief ���ò�������ķ�Χ������ ��ʼ?? �������� ,����Ŀ�??
 *
 * @param x ��ʼ�������
 * @param y ��ʼ��������
 * @param wide ����Ŀ�
 * @param high ����ĸ�
 */
void Int_LCD_SetArea(uint16_t x, uint16_t y, uint16_t wide, uint16_t high);

/**
 * @brief ����(����ɫ����������??)
 *
 * @param color ָ����ɫ
 */
void Int_LCD_ClearAll(uint16_t color);

/**
 * @brief ��ʾӢ���ַ�
 *
 * @param x �������??
 * @param y ������??
 * @param h ����߶�
 * @param c Ӣ���ַ�
 * @param fColor ������ɫ
 * @param bColor ������ɫ
 */
void Int_LCD_WriteAsciiChar(uint16_t x, uint16_t y, uint16_t h, uint8_t c,
                            uint16_t fColor, uint16_t bColor);

/**
 * @brief ��ʾӢ���ַ�??
 *
 * @param x �������??
 * @param y ������??
 * @param h ����߶�
 * @param str �ַ�??
 * @param fColor ������ɫ
 * @param bColor ������ɫ
 */
void Int_LCD_WriteAsciiString(uint16_t x, uint16_t y, uint16_t h, uint8_t *str,
                              uint16_t fColor, uint16_t bColor);

/**
 * @brief ��ʾһ����??
 *
 * @param x �������??
 * @param y ������??
 * @param h ����߶�
 * @param index  ���������λ??
 * @param fColor ������ɫ
 * @param bColor ������ɫ
 */
void Int_LCD_WriteChineseChar(uint16_t x, uint16_t y, uint16_t h, uint8_t index,
                              uint16_t fColor, uint16_t bColor);

/**
 * @brief ��ʾһ��ͼ??
 *
 * @param x ͼƬ��ʼ��x
 * @param y ͼƬ��ʼ��y
 * @param width  ����
 * @param height �߶�
 * @param img
 * @param len
 */
void Int_LCD_DisplayPicture(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const unsigned char *img, uint32_t len);

/**
 * @brief ��һ����(һ��ʵ��������) �������Ͻ���??
 *
 * @param x ��ʼx
 * @param y ��ʼy
 * @param wide ��Ĵ�С
 * @param color �����ɫ
 */
void Int_LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t wide, uint16_t color);

/**
 * @brief ��һ����
 *
 * @param x1 ��ʼx
 * @param y1 ��ʼy
 * @param x2 �յ�x
 * @param y2 �յ�y
 * @param wide �߿�
 * @param color �ߵ���ɫ
 */
void Int_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t wide, uint16_t color);

/**
 * @brief ��һ����?? �������εĶԽ�������
 *
 * @param x1 ��ʼ����
 * @param y1 ��ʼ����
 * @param x2 �Խ�����
 * @param y2 �Խ�����
 * @param wide �߿�
 * @param color �ߵ���ɫ
 */
void Int_LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t wide, uint16_t color);

/**
 * @brief ��һ������Բ
 *
 * @param xCenter Բ������x
 * @param yCenter Բ������y
 * @param r Բ�İ뾶
 * @param w �߿�
 * @param color �ߵ���ɫ
 */
void Int_LCD_DrawCircle(uint16_t xCenter, uint16_t yCenter, uint16_t r, uint16_t w, uint16_t color);

/**
 * @brief ��һ��ʵ��Բ
 *
 * @param xCenter Բ������x
 * @param yCenter Բ������y
 * @param r Բ�İ뾶
 * @param fColor ��Ȧ��ɫ
 * @param bColor Բ����ɫ
 */
void Int_LCD_DrawFilledCircle(uint16_t xCenter, uint16_t yCenter, uint16_t r, uint16_t fColor, uint16_t bColor);

void Int_LCD_color_Fill(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t *color);

void Int_LCD_color_lvgl(uint16_t x,uint16_t y,uint32_t color);


#endif
